import tool.ListNode;
import tool.createList;
import java.util.ArrayList;


/**
 * @Description:移除链表元素 给你一个链表的头节点 head 和一个整数 val ，
 * 请你删除链表中所有满足 Node.val == val 的节点，并返回 新的头节点 。
 * @Date:Create in 22:11  2022/6/20
 */
public class removeElements0203 {

    public static void main(String[] args) {
        int[] arrs = new int[]{1, 2, 6, 3, 4, 5, 6};
        ListNode head = createList.create_List(arrs);
        removeElements1(head,6);


    }

    /**
     * 添加虚节点方式
     * 时间复杂度 O(n)
     * 空间复杂度 O(1)
     */
    public static ListNode removeElements1(ListNode head, int val) {
        if (head == null) {
            return head;
        }
        ListNode dummy = new ListNode(-1, head);
        ListNode pre = dummy;
        ListNode cur = head;
        while (cur != null) {
            if(cur.val == val){
                pre.next = cur.next;
            }else{
                pre = cur;
            }
            cur = cur.next;
        }
        return dummy.next;
    }

    /**
     * 不添加虚拟节点方式
     * 时间复杂度 O(n)
     * 空间复杂度 O(1)
     */
    public static ListNode removeElements2(ListNode head, int val) {
        while(head != null && head.val == val){
            head = head.next;
        }

        if(head == null){
            return head;
        }

        ListNode pre = head;
        ListNode cur = head.next;

        while(cur!=null){
            if(cur.val == val){
                pre.next = cur.next;
            }else{
                pre = cur;
            }
            cur = cur.next;
        }
        return head;
    }



}
